package RapiWeb;

import RapiWeb.Objeto.Proyecto;
import Utilidades.Archivo;
import Utilidades.Utilidades;
import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 * @author Luis Antonio Lara Capetillo Fecha: 21/09/12
 *
 * Descripcion: Clase pricipal donde se crea un nuevo control
 *
 * @version 1.0
 */
public class Clase_Componente {

    private String str_NomControl;
    private Proyecto proyecto;
    private Utilidades utilidad = new Utilidades();
    private JP_Tabla tabla_Componentes;
    private ArrayList<Componente> lista_Componente;

    public Clase_Componente(Proyecto proyecto, String str_NomControl, JP_Tabla tabla_Componentes) {
        this.proyecto = proyecto;
        this.tabla_Componentes = tabla_Componentes;
        lista_Componente = tabla_Componentes.getLista_Componentes();
        this.str_NomControl = proyecto.getStr_Componentes() + str_NomControl;
    }

    /**
     * Metodo para crear encabezado de comentarios del archivo
     *
     * @param descripcion
     * @return str_Comentarios
     */
    private String m_CrearComentarios(String descripcion) {
        String str_Comentarios = "''========================================================\n"
                + "'' Autor: \t\t" + proyecto.getStr_Autor() + "\n"
                + "'' Fecha Creación: \t" + utilidad.dameFecha() + "\n"
                + "'' Descripcion: \t" + descripcion + "\n"
                + "''========================================================\n\n";
        return str_Comentarios;
    }

    /**
     * Metodo para crear la region de Property
     *
     * @return str_Property
     */
    private String m_Property() {
        String str_Property;
        str_Property = "#Region \"Propiedades\"\n";
        for (int i = 0; i < lista_Componente.size(); i++) {
            String property=lista_Componente.get(i).getStr_Property();
            if (!property.equals("") && !property.equals("\n")) {
                str_Property += lista_Componente.get(i).getStr_Property() + "\n";
            }
        }
        str_Property += m_Enable() + m_ReadOnly() + "\n#End Region\n";
        return str_Property;
    }

    /**
     * Metodo para crear la propiedad de Enable del control
     *
     * @return str_Enable
     */
    private String m_Enable() {
        Archivo archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo VB/Property/Enable.vb");
        String str_Enable = archivo.dameContenido() + "\n";
        String str_Componentes = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_Tipo().equals("") && !lista_Componente.get(i).getStr_Tipo().equals("lbl")) {
                str_Componentes += lista_Componente.get(i).getStr_NomComponente() + ".Enabled=value\n      ";
            }
        }
        str_Enable = str_Enable.replace("?Componentes", str_Componentes);
        return str_Enable;
    }

    /**
     * Metodo para crear la propiedad de ReadOnly del control
     *
     * @return str_ReadOnly
     */
    private String m_ReadOnly() {
        Archivo archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo VB/Property/ReadOnly.vb");
        String str_ReadOnly = archivo.dameContenido() + "\n";
        String str_Componentes = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_Tipo().equals("") && !lista_Componente.get(i).getStr_Tipo().equals("lbl")) {
                str_Componentes += lista_Componente.get(i).getStr_NomComponente() + ".ReadOnly=value\n      ";
            }
        }
        str_ReadOnly = str_ReadOnly.replace("?Componentes", str_Componentes);
        return str_ReadOnly;
    }

    /**
     * Metodo para crear la region de los Metodos
     *
     * @return str_Metodos
     */
    private String m_Metodos() {
        String str_Metodos;
        str_Metodos = "#Region \"Metodos\"\n";
        for (int i = 0; i < lista_Componente.size(); i++) {
            String metodo=lista_Componente.get(i).getStr_Metodo();
            if (!metodo.equals("")&& !metodo.equals("\n")) {
                str_Metodos += lista_Componente.get(i).getStr_Metodo() + "\n";
            }
        }
        str_Metodos += m_AsignarDatos() + "\n"
                + m_CodigoVB() + "\n"
                + m_VerificarDatos() + "\n"
                + "#End Region\n";
        return str_Metodos;
    }

    /**
     * Metoodo para crear la parte de CodigoVB de los componentes
     *
     * @return str_CodigoVB
     */
    private String m_CodigoVB() {
        String str_CodigoVB;
        str_CodigoVB = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_CodigoVB().equals("")&& !lista_Componente.get(i).getStr_Variable().equals("\n")) {
                str_CodigoVB += lista_Componente.get(i).getStr_CodigoVB() + "\n";
            }
        }
        return str_CodigoVB;
    }

    /**
     * Metodo para crear el metodo de asignarDatos al control
     *
     * @return str_AsigarDatos
     */
    private String m_AsignarDatos() {
        String str_AsigarDatos = "";
        String str_Datos = "";
        Archivo archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo VB/Funciones/LlenarDatosControl.vb");
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (lista_Componente.get(i).getStr_Tipo().equals(proyecto.getStr_TextField())) {
                str_Datos += "Me." + lista_Componente.get(i).getStr_NomComponente() + ".Text= tablaDatos.Rows(0)(\"" + lista_Componente.get(i).getStr_campoBD() + "\").ToString\n    ";
            }
        }
        str_AsigarDatos = archivo.dameContenido();
        str_AsigarDatos = str_AsigarDatos.replace("?Asignaciones", str_Datos);
        str_AsigarDatos = str_AsigarDatos.replace("?NomComponente", str_NomControl);
        return str_AsigarDatos;
    }
    
    /**
     * Metodo para crear el metodo de VerificarDatos al control
     *
     * @return str_AsigarDatos
     */
    private String m_VerificarDatos() {
        String str_VerificarDatos = "";
        String str_Datos = "";
        Archivo archivo = new Archivo();
        archivo.m_LeerArchivo("Archivos/Codigo VB/Funciones/VerificarDatosControl.vb");
        for (int i = 0; i < lista_Componente.size(); i++) {
            if (!lista_Componente.get(i).getStr_Tipo().equals(proyecto.getStr_Label()) && !lista_Componente.get(i).getStr_NomComponente().equals("")&& !lista_Componente.get(i).getStr_NomComponente().equals(proyecto.getStr_GridView())) {
                str_Datos +="str_Mensaje += validar.ValidaCampo("+ lista_Componente.get(i).getStr_NomComponente() +", \""+lista_Componente.get(i).getStr_campoBD()+"\")\n    ";
            }
        }
        str_VerificarDatos = archivo.dameContenido();
        str_VerificarDatos = str_VerificarDatos.replace("?Validaciones", str_Datos);
        str_VerificarDatos = str_VerificarDatos.replace("?NomComponente", str_NomControl);
        return str_VerificarDatos;
    }

    /**
     * Metodo para crear la regionn de eventos
     *
     * @return
     */
    private String m_Eventos() {
        String str_Eventos;
        str_Eventos = "#Region \"Eventos\"\n";
        for (int i = 0; i < lista_Componente.size(); i++) {
            String evento=lista_Componente.get(i).getStr_Evento();
            if (!evento.equals("")&& !evento.equals("\n")) {
                str_Eventos += lista_Componente.get(i).getStr_Evento() + "\n";
            }
        }
        str_Eventos += "#End Region\n";
        return str_Eventos;
    }

    /**
     * Metodo para crear las variables necesarias para el control
     *
     * @return str_Variable
     */
    private String m_Variables() {
        String str_Variable;
        str_Variable = "";
        for (int i = 0; i < lista_Componente.size(); i++) {
            String variable=lista_Componente.get(i).getStr_Variable();
            if (!variable.equals("") && !variable.equals("\n")) {
                str_Variable += "\t" + lista_Componente.get(i).getStr_Variable() + "\n";
            }
        }
        return str_Variable;
    }

    /**
     * Metodo para crear la clase VB del nuevo componente creado
     *
     * @return m_CrearClaseVB
     */
    private String m_CrearClaseVB() {
        String str_VB;
        str_VB = "" + m_CrearComentarios("Clase Componente " + str_NomControl)
                + "Public Class " + str_NomControl + "\n\n"
                +"  Inherits System.Web.UI.UserControl\n"
                + m_Variables()
                + m_Property()
                + m_Eventos()
                + m_Metodos()
                + "End Class\n";
        return str_VB;
    }

    /**
     * Metodo para crear el archivo ASCX
     *
     * @return str_ASCX
     */
    private String m_CrearClaseASCX() {
        String str_ASCX;
        str_ASCX = "<%@ Control Language=\"VB\" AutoEventWireup=\"false\" CodeFile=\"" + str_NomControl + ".ascx.vb\" Inherits=\"" + str_NomControl + "\" %>\n"
                + tabla_Componentes.m_ObtenerTablaASP();
        return str_ASCX;
    }

    /**
     * Metoro para crear un nuevo cotrol para ser agregado al proyecto
     *
     * @return
     */
    private String m_CrearControlNuevo() {
        String str_Control = "<CodigoASPX>\n"
                + "<uc1:" + str_NomControl + " ID=\"" + str_NomControl + "\" runat=\"server\"/>"
                + "<CodigoVB>\n"
                + "<Evento>\n"
                + "<Variable>\n"
                + "<Metodo>\n"
                + "<Property>\n"
                + "<Register>\n"
                + "<%@ Register src=\"../../Controles/" + str_NomControl + ".ascx\" tagname=\"" + str_NomControl + "\" tagprefix=\"ctl?Numero\" %>";

        return str_Control;
    }

    /**
     * Metodo para generar los archivos necesarios del nuevo control
     */
    public void m_GenerarControl() {
        String direccionCodigo = proyecto.getStr_NomProyecto() + "/Codigo/Controles";
        String direccionControl = proyecto.getStr_NomProyecto() + "/Controles";
        Archivo archivo = new Archivo();
        try {
            archivo.m_CrearCarpeta(direccionCodigo);
            archivo.m_CrearCarpeta(direccionControl);
            archivo.m_CrearArchivo(direccionCodigo + "/" + str_NomControl + ".ascx");
            archivo.m_CrearArchivo(direccionCodigo + "/" + str_NomControl + ".ascx.vb");
            archivo.m_CrearArchivo(direccionControl + "/" + str_NomControl + ".txt");
            String str_ContenidoASCX = m_CrearClaseASCX();
            String str_ContenidoVB = m_CrearClaseVB();
            String str_DatosControl = m_CrearControlNuevo();
            archivo.m_SobreEscribir(direccionCodigo + "/" + str_NomControl + ".ascx", str_ContenidoASCX);
            archivo.m_SobreEscribir(direccionCodigo + "/" + str_NomControl + ".ascx.vb", str_ContenidoVB);
            archivo.m_SobreEscribir(direccionControl + "/" + str_NomControl + ".txt", str_DatosControl);
            JOptionPane.showMessageDialog(null,"Control Creado "+archivo.dameError());

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,"Error m_GenerarControl: "+ ex.getMessage() + " Archivo: "+archivo.dameError());
            System.out.println("Error m_GenerarControl:" + ex.getMessage());
            System.out.println("Error de Archivo: " + archivo.dameError());
        }
    }
}
